#include "USerial.h"
#include <plugin/pcre/Pcre.h>

FilterDlg::FilterDlg()
{
    CtrlLayout(*this, "Filter");
	Zoomable().Sizeable().CenterScreen();

    filterEdit <<= THISBACK(FullFilter);
    filterDisplay.Highlight("log");

    //MyRegisterEvent(EVENT_MAIN_DISPLAY_LINE_UPDATE, THISBACK(OnDataRecv));
}

FilterDlg::~FilterDlg()
{
}

void FilterDlg::FullFilter()
{
    //遍历所有行，进行过滤
    //filterEdit中的每一行都是一个过滤条件，可以是正则表达式，也可以是普通字符串.
    //对mainDisplay中的每一行进行过滤，如果符合过滤条件，则将该行显示到filterDisplay中

    //清空filterDisplay
    filterDisplay.Clear();
    
    //如果editFilter为空，退出
    if (filterEdit.GetLineCount() == 0)
    {
        return;
    }


    //遍历mainDisplay中的每一行
    for (int i = 0; i < m_mainDisplay->GetLineCount(); i++)
    {
        //获取mainDisplay中的一行
        WString line = m_mainDisplay->GetWLine(i);

        //遍历filterEdit中的每一行
        for (int j = 0; j < filterEdit.GetLineCount(); j++)
        {
            //获取filterEdit中的一行
            String filter = filterEdit.GetUtf8Line(j);
            filter.Replace("\n", "");
            if (filter.GetCount() < 2)
            {
                continue;
            }

            // //默认使用正则表达式进行匹配
            RegExp r(filter);
            
            if (r.Match(line.ToString()))
            {
                //如果匹配成功，将该行显示到filterDisplay中
                filterDisplay.AppendAndScroll(line + "\n");
                break;
            }
        }
    }

    last_line = m_mainDisplay->GetLineCount();
}

void FilterDlg::OnDataRecv(const MyEvent& e)
{
#if 0
    GuiLock _;
    if (filterEdit.GetLineCount() == 0)
    {
        //如果filterEdit为空，直接显示到filterDisplay中
        return;
    }
    //只对接收到的数据进行过滤
    //第一字节为行号
    int current_line = e.event_data[0];
    WString data = e.event_data.Mid(1);

    //遍历filterEdit中的每一行, 进行过滤
    for (int i = 0; i < filterEdit.GetLineCount(); i++)
    {
        //获取filterEdit中的一行
        String filter = filterEdit.GetUtf8Line(i);
        filter.Replace("\n", "");
        if (filter.GetCount() < 2)
        {
            continue;
        }

        //默认使用正则表达式进行匹配
        RegExp r(filter);
        
        if (r.Match(data.ToString()))
        {
            //如果匹配成功，将该行显示到filterDisplay中
            filterDisplay.AppendAndScroll(data);
            if (current_line > last_line)
            {
                last_line = current_line;
                //insert newline
                filterDisplay.AppendAndScroll(WString("\n"));
            }
            break;
        }
    }

#endif
}
